#ifndef COLOR_MAP_H
#define COLOR_MAP_H

#include <QImage>
#include <QObject>
#include <QQuickPaintedItem>


/**
 * BUG::当图像放大到一定程度时，程序会卡死！！！！！！！！！！！！
 * TODO::drag并不可，还是固定图片大小，对于过长的图片，分块加载
 */

namespace solar
{
    class ColorMap : public QQuickPaintedItem
    {
            Q_OBJECT

            Q_PROPERTY(int img_resolution_x MEMBER img_resolution_x_)
            Q_PROPERTY(int img_resolution_y MEMBER img_resolution_y_)
            Q_PROPERTY(int img_width MEMBER original_img_width_)
            Q_PROPERTY(int img_height MEMBER original_img_height_)

            Q_PROPERTY(int xticks_num MEMBER xticks_num_)
            Q_PROPERTY(int yticks_num MEMBER yticks_num_)
            Q_PROPERTY(int font_size MEMBER font_size_)
            Q_PROPERTY(int png_bar_dist MEMBER png_bar_dist_)
            Q_PROPERTY(QString file_path MEMBER file_path_)

            // Q_PROPERTY(float max_value READ getMaxValue WRITE setMaxValue)
            Q_PROPERTY(float receiver_height MEMBER receiver_height_)
            Q_PROPERTY(float receiver_width MEMBER receiver_width_)
            Q_PROPERTY(int x_offset MEMBER x_offset_)
            Q_PROPERTY(int y_offset MEMBER y_offset_)
            Q_PROPERTY(float scale MEMBER scale_)

            // Q_PROPERTY(QImage img MEMBER img_)

        public:
            ColorMap(QQuickItem* parent = nullptr);

            ~ColorMap() override = default;

            void paint(QPainter* painter) override; // 最主要的画组件的函数

            // void updateColors();              // 生成对应的颜色及数值 ---
            // 每次min和max改变时进行调用 QColor getColor(float val);
            QColor getColor(float val, float min_val,
                            float max_val); // 这里的max_val,min_val是临时的，用于映射

            // float getMaxValue();
            // void setMaxValue(float max_value);
            auto getVisible() -> bool;
            void setVisible(bool visible);

        public slots:
            Q_INVOKABLE void setMinMax(float min, float max); // 修改colorbar的最大最小值
            Q_INVOKABLE void updateImage(const QImage&);
            Q_INVOKABLE void rePaint();
            Q_INVOKABLE void setVisible(); // 设置图像可见

        private:
            // QVector<QColor> colors_;        // 每个颜色
            // QVector<float> colors_value_;   // 每个颜色对应的数值
            // QMap<float, QColor> colors_value_;
            // float max_value_ = 700;
            // float min_value_ = 0;
            // int resolution_height_;
            // int resolution_width_;
            float receiver_height_; // 接收器的高度和宽度---单位：m
            float receiver_width_;
            int num = 8;
            QImage img_;

            int colorbar_height_;
            int colorbar_width_;
            int colorbar_ticks_num_; // colorbar上的标签数目
            int png_bar_dist_;       // 图片距离颜色bar的距离

            int img_resolution_x_; // 图片的分辨率
            int img_resolution_y_;

            int original_img_width_;  // 图片的宽
            int original_img_height_; // 图片的高
            int xticks_num_;          // 图片x轴上标签的数目
            int yticks_num_;
            int font_size_; // 字体大小

            int x_offset_; // 为了让内容显示完全，需要图片偏移一个距离
            int y_offset_;

            QString file_path_; // 图片路径：如果是相对路径，则是相对于build文件夹的

            bool visible_; // 控制整张图片是否显示

            float scale_ = 1.0; // 控制图片大小
    };
} // namespace solar

#endif
